package com.ruoyi.factorydata.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.factorydata.domain.CraftProcessMaterialRelation;
import com.ruoyi.factorydata.domain.MaterialRequisitionDetail;
import com.ruoyi.factorydata.domain.WorkOrderInfo;
import com.ruoyi.factorydata.domain.dto.ProductStatisticsDTO;
import com.ruoyi.factorydata.domain.dto.WorkOrderPrintDTO;
import com.ruoyi.factorydata.domain.dto.WorkOrderStatisticsDTO;

import java.util.List;
import java.util.Map;

/**
 * 工单信息Service接口
 *
 * @author ruoyi
 * @date 2025-07-27
 */
public interface IWorkOrderInfoService extends IService<WorkOrderInfo> {
    /**
     * 查询工单信息
     *
     * @param id 工单信息主键
     * @return 工单信息
     */
    public WorkOrderInfo selectWorkOrderInfoById(Long id);

    /**
     * 工单统计
     *
     * @param workOrderInfo 工单信息
     */
    List<WorkOrderStatisticsDTO> statisticsList(WorkOrderInfo workOrderInfo);

    /**
     * 工单产品统计
     *
     * @param workOrderInfo 工单信息
     */
    List<ProductStatisticsDTO> statisticsProductList(WorkOrderInfo workOrderInfo);

    /**
     * 查询工单信息列表
     *
     * @param workOrderInfo 工单信息
     * @return 工单信息集合
     */
    public List<WorkOrderInfo> selectWorkOrderInfoList(WorkOrderInfo workOrderInfo);

    /**
     * 获取已分配的任务数据
     *
     * @param workOrderInfo 工单信息
     */
    List<WorkOrderInfo> selectWorkOrderInfoTaskList(WorkOrderInfo workOrderInfo);

    /**
     * 新增工单信息
     *
     * @param workOrderInfo 工单信息
     * @return 结果
     */
    public int insertWorkOrderInfo(WorkOrderInfo workOrderInfo);

    /**
     * 修改工单信息
     *
     * @param workOrderInfo 工单信息
     * @return 结果
     */
    public int updateWorkOrderInfo(WorkOrderInfo workOrderInfo);

    /**
     * 批量删除工单信息
     *
     * @param ids 需要删除的工单信息主键集合
     * @return 结果
     */
    public int deleteWorkOrderInfoByIds(Long[] ids);

    /**
     * 删除工单信息信息
     *
     * @param id 工单信息主键
     * @return 结果
     */
    public int deleteWorkOrderInfoById(Long id);

    /**
     * 根据项目id获取工单运行次数
     *
     * @param projectId 项目id
     * @return 工单运行次数
     */
    Integer getWorkOrderRunNumByProject(Long projectId);

    /**
     * 根据项目id获取工单运行次数缓存
     *
     * @param projectId          项目id
     * @param projectRunNumCache 工单运行次数缓存
     * @return 工单运行次数
     */
    Integer getWorkOrderRunNumByProjectAndCache(Long projectId, Map<Long, Integer> projectRunNumCache);

    /**
     * 启动工单
     *
     * @param workOrderId 工单id
     */
    int startWorkOrderInfo(Long workOrderId);
    /**
     * 暂停工单
     *
     * @param workOrderId 工单id
     */
    int suspendWorkOrderInfo(Long workOrderId);
    /**
     * 取消暂停工单
     *
     * @param workOrderId 工单id
     */
    int cancelSuspendWorkOrderInfo(Long workOrderId);
    /**
     * 工单所需物料
     *
     * @param workOrderId 工单id
     */
    List<CraftProcessMaterialRelation> getMaterial(Long workOrderId);

    /**
     * 申请物料
     *
     * @param workOrderId         工单id
     * @param materialRequisition 申请物料
     */
    int applyMaterial(Long workOrderId, List<CraftProcessMaterialRelation> materialRequisition);

    /**
     * 退料
     *
     * @param workOrderId               工单id
     * @param materialRequisitionDetail 申请物料
     */
    int returnMaterial(Long workOrderId, MaterialRequisitionDetail materialRequisitionDetail);

    /**
     * 下一工序
     *
     * @param workOrderId    工单id
     * @param actualQuantity 工单产量
     * @param scrapQuantity  报废数
     */
    int next(Long workOrderId, Integer actualQuantity, Integer scrapQuantity);
    /**
     * 工单完工校验
     * @param workOrderId 工单id
     */
    Integer finishValidate(Long workOrderId);
    /**
     * 工单负责人转移
     *
     * @param workOrderId      工单id
     * @param workOrderOwnerId 工单负责人
     */
    int transferOwner(Long workOrderId, Long workOrderOwnerId);

    /**
     * 工序负责人转移
     *
     * @param workOrderId    工单id
     * @param processOwnerId 工序负责人id
     */
    int transferProcessOwner(Long workOrderId, Long processOwnerId);

    /**
     * 工单取消
     *
     * @param plainId 工单id
     * @param source  工单来源: project:项目, plain:计划
     */
    int cancelByPlain(Long plainId, String source);

    /**
     * 工单取消
     *
     * @param workOrderId 工单来源: project:项目, plain:计划
     * @param source      工单来源: project:项目, plain:计划  workOrder:工单
     */
    int cancel(Long workOrderId, String source);

    /**
     * 获取计划实际产量
     *
     * @param plainId 计划id
     */
    Long sumPlainActualQuantity(Long plainId);

    /**
     * 打印工单
     *
     * @param workOrderId 工单id
     * @return 工单打印信息
     */
    WorkOrderPrintDTO printWorkOrder(Long workOrderId);

}